package com.soilflow.common.core.domain.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.soilflow.common.annotation.Excel;
import com.soilflow.common.core.domain.BaseEntity;
import com.soilflow.common.utils.easyexcel.SexConverter;
import com.soilflow.common.utils.easyexcel.StatusConverter;
import com.soilflow.common.xss.Xss;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * 用户对象 sys_user
 * <p>
 * 包含党员信息
 *
 * @author soilflow
 */
@ColumnWidth(18)
public class SysUserReception extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /** 搜索值 */
    @TableField(exist = false)
    @ExcelIgnore
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private String searchName;

    /** 搜索值 */
    @TableField(exist = false)
    @ExcelIgnore
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private String branchOrganization;

    /**
     * 用户ID
     */
    //@Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
    @TableId(value = "user_id")
    @ExcelIgnore
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long userId;

    /**
     * 部门ID
     */
    @ExcelIgnore
    //@Excel(name = "部门编号", type = Type.IMPORT)
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long deptId;

    //用户类型
    @ExcelIgnore
    private String userType;

    /**
     * 用户账号
     */
    @ExcelIgnore
    //@Excel(name = "登录名称")
    private String userName;



    /**
     * 用户编号
     */
    @ExcelIgnore
    //@Excel(name = "登录名称")
    private String code;


    /**
     * 用户头像
     */
    @ExcelIgnore
    private String avatar;

    /**
     * 密码
     */
    @ExcelIgnore
    private String password;



    /**
     * 删除标志（0代表存在 2代表删除）
     */
    @ExcelIgnore
    private String delFlag;

    /**
     * 最后登录IP
     */
    @ExcelIgnore
    private String loginIp;

    /**
     * 最后登录时间
     */
    @ExcelIgnore
    private Date loginDate;

    /**
     * 部门对象
     */
    //@Excels({
    //        @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
    //        @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
    //})
    @TableField(exist = false)
    @ExcelIgnore
    private SysDept dept;

    /**
     * 角色对象
     */
    @ExcelIgnore
    @TableField(exist = false)
    private List<SysRole> roles;

    /**
     * 角色组
     */
    @ExcelIgnore
    @TableField(exist = false)
    private Long[] roleIds;

    /**
     * 岗位组
     */
    @ExcelIgnore
    @TableField(exist = false)
    private Long[] postIds;

    /**
     * 角色ID
     */
    @ExcelIgnore
    @TableField(exist = false)
    private Long roleId;

    //姓名
    @ExcelIgnore
    private String name;

    @ExcelIgnore
    private String deleted;

    /**
     * --------------------------------------党员---------------------------------------------------------------------
     */


    /**
     * 用户昵称
     */
    @Excel(name = "姓名")
    @ExcelProperty(value = "姓名")
    private String nickName;

    /**
     * 用户性别
     */
    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
    @ExcelProperty(value = "用户性别", converter = SexConverter.class)
    private String sex;
    /**
     * 用户邮箱
     */
    @Excel(name = "用户邮箱")
    @ExcelProperty("用户邮箱")
    private String email;

    /**
     * 手机号码
     */
    @Excel(name = "手机号码")
    @ExcelProperty("手机号码")
    @Size(min = 11, max = 11, message = "手机号码长度需11个字符")
    private String phonenumber;



    /**
     * 帐号状态（0正常 1停用）
     */
    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
    @ExcelProperty(value = "帐号状态",converter = StatusConverter.class)
    private String status;

    public SysUserReception() {

    }



    public String getBranchOrganization() {
        return branchOrganization;
    }

    public void setBranchOrganization(String branchOrganization) {
        this.branchOrganization = branchOrganization;
    }


    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }


    public String getSearchName() {
        return searchName;
    }

    public void setSearchName(String searchName) {
        this.searchName = searchName;
    }

    public String getUserType() {
        return userType;
    }

    public void setUserType(String userType) {
        this.userType = userType;
    }

    public SysUserReception(Long userId) {
        this.userId = userId;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public boolean isAdmin() {
        return isAdmin(this.userId);
    }

    public static boolean isAdmin(Long userId) {
        return userId != null && 1L == userId;
    }

    public Long getDeptId() {
        return deptId;
    }

    public void setDeptId(Long deptId) {
        this.deptId = deptId;
    }

    @Xss(message = "用户昵称不能包含脚本字符")
    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    @Xss(message = "用户账号不能包含脚本字符")
    @NotBlank(message = "用户账号不能为空")
    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    @Email(message = "邮箱格式不正确")
    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Size(min = 11, max = 11, message = "手机号码长度需11个字符")
    public String getPhonenumber() {
        return phonenumber;
    }

    public void setPhonenumber(String phonenumber) {
        this.phonenumber = phonenumber;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getDelFlag() {
        return delFlag;
    }

    public void setDelFlag(String delFlag) {
        this.delFlag = delFlag;
    }

    public String getLoginIp() {
        return loginIp;
    }

    public void setLoginIp(String loginIp) {
        this.loginIp = loginIp;
    }

    public Date getLoginDate() {
        return loginDate;
    }

    public void setLoginDate(Date loginDate) {
        this.loginDate = loginDate;
    }

    public SysDept getDept() {
        return dept;
    }

    public void setDept(SysDept dept) {
        this.dept = dept;
    }

    public List<SysRole> getRoles() {
        return roles;
    }

    public void setRoles(List<SysRole> roles) {
        this.roles = roles;
    }

    public Long[] getRoleIds() {
        return roleIds;
    }

    public void setRoleIds(Long[] roleIds) {
        this.roleIds = roleIds;
    }

    public Long[] getPostIds() {
        return postIds;
    }

    public void setPostIds(Long[] postIds) {
        this.postIds = postIds;
    }

    public Long getRoleId() {
        return roleId;
    }

    public void setRoleId(Long roleId) {
        this.roleId = roleId;
    }

    @Override
    public String toString() {
        return "SysUser{" +
                "userId=" + userId +
                ", deptId=" + deptId +
                ", userName='" + userName + '\'' +
                ", nickName='" + nickName + '\'' +
                ", email='" + email + '\'' +
                ", phonenumber='" + phonenumber + '\'' +
                ", sex='" + sex + '\'' +
                ", avatar='" + avatar + '\'' +
                ", password='" + password + '\'' +
                ", status='" + status + '\'' +
                ", delFlag='" + delFlag + '\'' +
                ", loginIp='" + loginIp + '\'' +
                ", loginDate=" + loginDate +
                ", dept=" + dept +
                ", roles=" + roles +
                ", roleIds=" + Arrays.toString(roleIds) +
                ", postIds=" + Arrays.toString(postIds) +
                ", roleId=" + roleId +

                '}';
    }


    public String getDeleted() {
        return deleted;
    }

    public void setDeleted(String deleted) {
        this.deleted = deleted;
    }



    public SysUserReception(Long userId, Long deptId, String userName, String nickName, String email, String phonenumber, String sex, String avatar, String password, String status, String delFlag, String loginIp, Date loginDate, SysDept dept, List<SysRole> roles, Long[] roleIds, Long[] postIds, Long roleId, String memberId, String name, String idNumber, String nation, Short maritalStatus, String nativePlace, Date joinDate, Date birthday, Date confirmationDate, Short soilflowDuty, String residence, String workUnit, Short jobTitle, String workPlace, Short educationBackground, Short educationDegree, String telephone, String otherWays, Short soilflowMembershipStatus, Short isMissingMember, Date missingDate, Short isDeath, Date death_time, Short isDifficult, Short isMemberFlow, Short flowType, String activityNumber, String flowOutPlace, Date flowOutTime, String flowOutContacts, String flowOutOrganization, String flowOutTelephone, String flowInPlace, String flowInContacts, String flowInTelephone, String flowInOrganization, Short memberType, Date duesExpireTime, BigDecimal soilflowDuesPerMonth) {
        this.userId = userId;
        this.deptId = deptId;
        this.userName = userName;
        this.nickName = nickName;
        this.email = email;
        this.phonenumber = phonenumber;
        this.sex = sex;
        this.avatar = avatar;
        this.password = password;
        this.status = status;
        this.delFlag = delFlag;
        this.loginIp = loginIp;
        this.loginDate = loginDate;
        this.dept = dept;
        this.roles = roles;
        this.roleIds = roleIds;
        this.postIds = postIds;
        this.roleId = roleId;

        this.name = name;

    }




    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



}
